package com.freemalll.merchant.utils;

import com.freemalll.common.redis.service.RedisService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @Description: 日期编号工具类 16位 yyyyMMdd+8位随机数
 * @Author: WuBo
 * @CreateTime: 2023-9-18 11:27:23
 * @Version: 1.0
 */
@Component
public class DataNoUtil {

    @Resource
    private RedisService redisService;
    public static Random random = new Random();  // Compliant

    /**
     * 生成16位唯一随机号，yyyyMMdd+8位数字
     * 8位数字，
     * @return
     */
    public String generateSerialNo(String type){
        //先查询到今天的日期，格式:"yyyyMMdd"
        String todayDate = new SimpleDateFormat("yyyyMMdd")
                .format(new Date());
        //再通过key查询缓存有没有num数据，缓存操作根据自身项目封装工具类
        String codeNumNew;// 新的16位随机号
        String codeNumOld = null;
        //如果缓存查询有值，重新获得一个随机号
        do{
            codeNumNew = todayDate + getEightRandom();
            try {
                Object o = redisService.getCacheObject(type+codeNumNew);// key : risk2024012312345678, value : 2024012312345678
                codeNumOld = o == null ? null : o.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }while (codeNumNew.equals(codeNumOld));
        //设置缓存，调用此方法，会将随机生成的编码进行保存，保存时长：今天剩余的时间
        try {
            redisService.setCacheObject(type+codeNumNew, codeNumNew, getSeconds(), TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return codeNumNew;
    }

    /**
     * 获取当天结束还剩余多少秒
     * @return
     */
    public long getSeconds(){
        //获取今天当前时间
        Calendar curDate = Calendar.getInstance();
        //获取明天凌晨0点的日期
        Calendar tommorowDate = new GregorianCalendar(
                curDate.get(Calendar.YEAR),
                curDate.get(Calendar.MONTH),
                curDate.get(Calendar.DATE) + 1,
                0, 0, 0);
        //返回 明天凌晨0点 和 今天当前时间 的差值（秒数）
        return (tommorowDate.getTimeInMillis() - curDate .getTimeInMillis()) / 1000;
    }

    /**
     * 获取一个随机八位数
     * @author: WuBo
     * @date:  2022/10/10 16:26
     **/
    public static String getEightRandom(){
        StringBuilder fourRandom = new StringBuilder(random.nextInt(100000000) + "");
        int randLength = fourRandom.length();
        if(randLength<8){
            for(int i=1; i<=8-randLength; i++)
                fourRandom.insert(0, "0");
        }
        return fourRandom.toString();
    }


}
